package com.example.logsdemo.service1;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * DemoService 演示在业务层中如何使用 Log4j2 记录日志。
 * 说明：
 *  - 建议在每个类中都定义一个私有的 Logger 实例，命名为 logger。
 *  - 使用参数化日志（{} 占位符）避免字符串拼接带来的性能开销。
 */
@Service
public class DemoService {

    /**
     * 当前类的日志记录器。
     * LogManager.getLogger(DemoService.class) 会使用类名作为日志器名称，便于筛选。
     */
    private static final Logger logger = LoggerFactory.getLogger(DemoService.class);

    /**
     * 计算两个整数的和，并输出不同级别的日志。
     * @param leftOperand  左操作数
     * @param rightOperand 右操作数
     * @return 两数之和
     */
    public int calculateSum(int leftOperand, int rightOperand) {
        // DEBUG：输出详细的计算过程，通常仅在开发或排查问题时打开
        logger.debug("Start calculateSum, leftOperand={}, rightOperand={}", leftOperand, rightOperand);

        int result = leftOperand + rightOperand;

        // INFO：记录业务关键路径的正常行为
        logger.info("Calculated sum result={}", result);

        // WARN：提醒潜在的风险或非预期但可继续运行的情况
        if (Math.abs(result) > 10_000) {
            logger.warn("Sum is quite large: {} (|result| > 10_000)", result);
        }

        return result;
    }

    /**
     * 演示如何记录异常：
     *  - 日志中打印异常栈可以帮助快速定位问题。
     */
    public void failOperation() {
        try {
            // 人为制造一个异常：除以零
            int x = 1 / 0;
            logger.info("This line will not be printed: {}", x);
        } catch (Exception ex) {
            // ERROR：记录错误并附带异常堆栈（使用占位符传入异常对象）
            logger.error("Operation failed due to unexpected error", ex);
            // 继续向上抛出，交给控制层或全局异常处理
            throw ex;
        }
    }
}


